from datetime import datetime
from sqlalchemy import String
from app import db
from app.util.generator_id import generate_12_id
from app.enums import enums
'''
数据库与实体类的映射，
将所有表的映射类放到这个py文件中
'''


class User(db.Model):
    __tablename__ = 'user'  # 必须与表名一致
    # __table_args__ = {'autoload_with': db.engine}  # 直接引用 db.engine
    __table_args__ = {'extend_existing': True}  # 如果表存在，则扩展表

    id = db.Column(
        String(12),  # varchar(36)
        primary_key=True,
        default=lambda: generate_12_id()  # 自动生成ID
    )
    # 显示定义create_time，覆盖反射的字段
    create_time = db.Column(
        db.DateTime,
        default=datetime.now(),  # 创建时自动设置时间
    )
    # 显式定义 update_time，覆盖反射的字段
    update_time = db.Column(
        db.DateTime,
        default=datetime.now(),  # 创建时自动设置时间
        onupdate=datetime.now()  # 更新时自动更新时间
    )
    status = db.Column(db.Integer, default=enums.UserStatusEnum.NORMAL.value)# 用户状态(默认正常状态)


class House(db.Model):
    __tablename__ = 'house'
    __table_args__ = {'extend_existing': True}  # 如果表存在，则扩展表
    # 显示定义create_time，覆盖反射的字段
    create_time = db.Column(
        db.DateTime,
        default=datetime.now(),  # 创建时自动设置时间
    )
    # 显式定义 update_time，覆盖反射的字段
    update_time = db.Column(
        db.DateTime,
        default=datetime.now(),  # 创建时自动设置时间
        onupdate=datetime.now()  # 更新时自动更新时间
    )

    def to_dict(self):
        """将模型对象转换为字典"""
        return {
            'id': self.id,
            'title': self.title,
            'price': self.price,

            # 添加需要返回的其他字段
        }


class Address(db.Model):
    __tablename__ = 'address'
    __table_args__ = {'extend_existing': True}  # 如果表存在，则扩展表


class Message(db.Model):
    __tablename__ = 'message'
    __table_args__ = {'extend_existing': True}  # 如果表存在，则扩展表
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.BigInteger, nullable=False)
    role = db.Column(db.SmallInteger, nullable=False)
    content = db.Column(db.Text, nullable=False)
    target = db.Column(db.BigInteger, nullable=False)
    timestamp = db.Column(db.BigInteger, nullable=False)

    # 将模型对象转换为字典，以便于序列化输出。
    def to_dict(self):
        return {
            'id': self.id,
            'user_id': self.user_id,
            'role': self.role,
            'content': self.content,
            'target': self.target,
            'timestamp': self.timestamp,
        }